From 215f35f5c119573eb1c8f6f38e33d54d464fe575 Mon Sep 17 00:00:00 2001 From: "kaf24@firebug.cl.cam.ac.uk" Date: Fri, 4 Nov 2005 11:08:45 +0100 Subject: [PATCH] This is a fix for some device model corner cases including: 1: mistake sequence of set/clr to virtual IRQ line. 2: wrong sequence of IRQ request clear 3: Add one more place to enable_irq_window. Signed-off-by: Eddie Dong --- tools/ioemu/hw/i8259_stub.c | 4 ++-- xen/arch/x86/dm/i8259.c | 2 +- xen/arch/x86/vmx_io.c | 1 + 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/tools/ioemu/hw/i8259_stub.c b/tools/ioemu/hw/i8259_stub.c index 2315184e9e..d0cfa1e4c6 100644 --- a/tools/ioemu/hw/i8259_stub.c +++ b/tools/ioemu/hw/i8259_stub.c @@ -55,13 +55,13 @@ void pic_set_irq(int irq, int level) if ( gio->pic_elcr & mask ) { /* level */ if ( level ) { - atomic_set_bit(irq, &gio->pic_irr); atomic_clear_bit(irq, &gio->pic_clear_irr); + atomic_set_bit(irq, &gio->pic_irr); global_env->send_event = 1; } else { - atomic_set_bit(irq, &gio->pic_clear_irr); atomic_clear_bit(irq, &gio->pic_irr); + atomic_set_bit(irq, &gio->pic_clear_irr); global_env->send_event = 1; } } diff --git a/xen/arch/x86/dm/i8259.c b/xen/arch/x86/dm/i8259.c index efb5e693c6..ed3ffc8eaf 100644 --- a/xen/arch/x86/dm/i8259.c +++ b/xen/arch/x86/dm/i8259.c @@ -512,10 +512,10 @@ int cpu_get_pic_interrupt(struct vcpu *v, int *type) if ( !plat->interrupt_request ) return -1; + plat->interrupt_request = 0; /* read the irq from the PIC */ intno = pic_read_irq(s); *type = VLAPIC_DELIV_MODE_EXT; - plat->interrupt_request = 0; return intno; } diff --git a/xen/arch/x86/vmx_io.c b/xen/arch/x86/vmx_io.c index df3c36513d..33d4c7290c 100644 --- a/xen/arch/x86/vmx_io.c +++ b/xen/arch/x86/vmx_io.c @@ -881,6 +881,7 @@ asmlinkage void vmx_intr_assist(void) __vmread(VM_ENTRY_INTR_INFO_FIELD, &intr_fields); if (intr_fields & INTR_INFO_VALID_MASK) { + enable_irq_window(cpu_exec_control); VMX_DBG_LOG(DBG_LEVEL_1, "vmx_intr_assist: intr_fields: %lx", intr_fields); return; -- 2.30.2